/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package wf3.kernel;

import acceso.hibernate.AQuery;
import acceso.servicio.Service_manager;
import acceso.servicio.correo.SCorreo;
import acceso.util.Escritor;
import acceso.util.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import org.hibernate.StatelessSession;
import wf3.core.Configuration;
import wf3.core.manager.Factory;
import wf3.core.task.DAOTask;
import wf3.util.Util;

/**
 *
 * @author romulogalindo
 */
public class WorkflowFactory extends Factory {

    static Timer time;
    static Configuration configuration;

    public static synchronized void updateConfiguration(Configuration cfg) {
        time = new Timer();
        configuration = cfg;
    }

    public static Configuration getConfiguration() {
        return configuration;
    }

    public static void StartupLog() {
        System.out.print("[Log]");
        Escritor.actualiza_formato(configuration.getProperties().getProperty("log.formato"));
        Escritor.actualiza_loglevel(configuration.getProperties().getProperty("log.level"));
        System.out.println(" ..OK");
    }

    public static void StartupDBConnection() {
        Escritor.escribe_debug("Iniciando conexion a la DB");
        StatelessSession session = acceso.hibernate.AccesoHibernate.getSessionFactory().openStatelessSession();
        //Codigo extra, para cargar datos del ubigeo
        AQuery query = new AQuery(session.getNamedQuery("public.ubigeo"));
        Util.buildUbigeo(query.list());
        session.close();
        Escritor.escribe_info("Conectado a la DB");
    }

    public static void StartupServices() {
        Escritor.escribe_debug("Iniciando levante de servicios");
        if (configuration.getProperties().getProperty("workflow.servicio.correo").contentEquals("true")) {
            List lista_servicios = new ArrayList();
            lista_servicios.add(new SCorreo(configuration.getProperties()));
            Service_manager.add_servicio(lista_servicios);
            Service_manager.get_servicio(0).iniciar();
        }
        if (configuration.getProperties().getProperty("workflow.servicio.twitter").contentEquals("true")) {
            Service.cargar();
            Service.iniciar();
        }
        Escritor.escribe_info("Servicios levantados");
    }

    public static void StartupGarbage() {
        Escritor.escribe_debug("Iniciando Gargage.");
        try {
            time.scheduleAtFixedRate(new DAOTask(), 100, 30 * 1000);
            Escritor.escribe_info("Garbage operativo.");
        } catch (Exception ep) {
            Escritor.escribe_errors("Error al levantar el Garbage:" + ep.getMessage());
        }
    }

    public static void StopGarbage() {
        try {
            time.cancel();
        } catch (Exception ep) {
            System.out.println("[WorkflowFactory:StopGarbage()] iniciando garbage");
        }
    }

}
